/*
 * @Author: 0x9DEFA478
 * @Date: 2021-03-11 17:53:34
 * @LastEditTime: 2021-06-04 12:17:51
 * @LastEditors: 0x9DEFA478
 * @Description: 先进先出控制器 仅需保障写入不被重入 读取不被重入 fifo就不会损坏 读取(写入)可被写入(读取)打断而FIFO不会损坏 具有长度记录 兼具效率与空间利用率
 * ============================================================================================================================================
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * ============================================================================================================================================
 * 
 */


#ifndef APP_INCLUDE_H_FIFO_PACK_H_
#define APP_INCLUDE_H_FIFO_PACK_H_

#include "H_Type.h"



typedef struct{

	volatile Hbyte_ptr Buffer;//用于存放数据缓存
	volatile int BufferSize;//缓存大小
	volatile int Buffer_InId;//缓存写入偏移
	volatile int Buffer_OutId;//缓存输出偏移

	int* volatile SizeArray;//长度表
	volatile int SizeArraySize;//长度表最大记录个数
	volatile int SizeArray_InId;//长度表写入偏移 容量判据
	volatile int SizeArray_OutId;//长度表读取偏移 容量判据

}H_FIFO_Pack_Byte_Def;

typedef struct{

	volatile Huint16_ptr Buffer;//用于存放数据缓存
	volatile int BufferSize;//缓存大小
	volatile int Buffer_InId;//缓存写入偏移
	volatile int Buffer_OutId;//缓存输出偏移

	int* volatile SizeArray;//长度表
	volatile int SizeArraySize;//长度表最大记录个数
	volatile int SizeArray_InId;//长度表写入偏移 容量判据
	volatile int SizeArray_OutId;//长度表读取偏移 容量判据

}H_FIFO_Pack_UInt16_Def;

typedef struct{

	volatile Huint32_ptr Buffer;//用于存放数据缓存
	volatile int BufferSize;//缓存大小
	volatile int Buffer_InId;//缓存写入偏移
	volatile int Buffer_OutId;//缓存输出偏移

	int* volatile SizeArray;//长度表
	volatile int SizeArraySize;//长度表最大记录个数
	volatile int SizeArray_InId;//长度表写入偏移 容量判据
	volatile int SizeArray_OutId;//长度表读取偏移 容量判据

}H_FIFO_Pack_UInt32_Def;

typedef struct{

	volatile Huint64_ptr Buffer;//用于存放数据缓存
	volatile int BufferSize;//缓存大小
	volatile int Buffer_InId;//缓存写入偏移
	volatile int Buffer_OutId;//缓存输出偏移

	int* volatile SizeArray;//长度表
	volatile int SizeArraySize;//长度表最大记录个数
	volatile int SizeArray_InId;//长度表写入偏移 容量判据
	volatile int SizeArray_OutId;//长度表读取偏移 容量判据

}H_FIFO_Pack_UInt64_Def;


//fifo是否不为空
#define H_FIFO_Pack_isNoEmpty(fifo)              (fifo->SizeArray_InId!=fifo->SizeArray_OutId)



/**
 * @brief 向FIFO中添加包
 * @param fifo FIFO结构体
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_Byte_AddPack(H_FIFO_Pack_Byte_Def* fifo,Hbyte_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包
 * @param fifo FIFO结构体
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt16_AddPack(H_FIFO_Pack_UInt16_Def* fifo,Huint16_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包
 * @param fifo FIFO结构体
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt32_AddPack(H_FIFO_Pack_UInt32_Def* fifo,Huint32_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包
 * @param fifo FIFO结构体
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt64_AddPack(H_FIFO_Pack_UInt64_Def* fifo,Huint64_ptr Data,int Len);






/**
 * @brief 向FIFO中添加包(首Data添加通道号)
 * @param fifo FIFO结构体
 * @param channel 通道号
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_Byte_AddPackChannel(H_FIFO_Pack_Byte_Def* fifo,Hbyte channel,Hbyte_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包(首Data添加通道号)
 * @param fifo FIFO结构体
 * @param channel 通道号
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt16_AddPackChannel(H_FIFO_Pack_UInt16_Def* fifo,Huint16 channel,Huint16_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包(首Data添加通道号)
 * @param fifo FIFO结构体
 * @param channel 通道号
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt32_AddPackChannel(H_FIFO_Pack_UInt32_Def* fifo,Huint32 channel,Huint32_ptr Data,int Len);

/**
 * @brief 向FIFO中添加包(首Data添加通道号)
 * @param fifo FIFO结构体
 * @param channel 通道号
 * @param Data 要添加的数据
 * @param Len 长度
 * @return 0:成功 其他:失败 空间或剩余数量不足
 */
int H_FIFO_Pack_UInt64_AddPackChannel(H_FIFO_Pack_UInt64_Def* fifo,Huint64 channel,Huint64_ptr Data,int Len);






/**
 * @brief 读取数据包
 * @param fifo FIFO结构体
 * @param LenPtr 整型指针 用于返回读取的长度(单位:Data的类型的一个元素的大小)
 * @return 数据指针 如果为NULL((void*)0)表示无可用数据
 */
Hbyte_ptr H_FIFO_Pack_Byte_Read(H_FIFO_Pack_Byte_Def* fifo,int* LenPtr);

/**
 * @brief 读取数据包
 * @param fifo FIFO结构体
 * @param LenPtr 整型指针 用于返回读取的长度(单位:Data的类型的一个元素的大小)
 * @return 数据指针 如果为NULL((void*)0)表示无可用数据
 */
Huint16_ptr H_FIFO_Pack_UInt16_Read(H_FIFO_Pack_UInt16_Def* fifo,int* LenPtr);

/**
 * @brief 读取数据包
 * @param fifo FIFO结构体
 * @param LenPtr 整型指针 用于返回读取的长度(单位:Data的类型的一个元素的大小)
 * @return 数据指针 如果为NULL((void*)0)表示无可用数据
 */
Huint32_ptr H_FIFO_Pack_UInt32_Read(H_FIFO_Pack_UInt32_Def* fifo,int* LenPtr);

/**
 * @brief 读取数据包
 * @param fifo FIFO结构体
 * @param LenPtr 整型指针 用于返回读取的长度(单位:Data的类型的一个元素的大小)
 * @return 数据指针 如果为NULL((void*)0)表示无可用数据
 */
Huint64_ptr H_FIFO_Pack_UInt64_Read(H_FIFO_Pack_UInt64_Def* fifo,int* LenPtr);






/**
 * @brief 读取数据指针切换到下一个(如果有的话)
 * @param fifo FIFO结构体
 * @return 无
 */
void H_FIFO_Pack_Byte_Next(H_FIFO_Pack_Byte_Def* fifo);

/**
 * @brief 读取数据指针切换到下一个(如果有的话)
 * @param fifo FIFO结构体
 * @return 无
 */
void H_FIFO_Pack_UInt16_Next(H_FIFO_Pack_UInt16_Def* fifo);

/**
 * @brief 读取数据指针切换到下一个(如果有的话)
 * @param fifo FIFO结构体
 * @return 无
 */
void H_FIFO_Pack_UInt32_Next(H_FIFO_Pack_UInt32_Def* fifo);

/**
 * @brief 读取数据指针切换到下一个(如果有的话)
 * @param fifo FIFO结构体
 * @return 无
 */
void H_FIFO_Pack_UInt64_Next(H_FIFO_Pack_UInt64_Def* fifo);






/**
 * @brief 获取可再写入的最大长度
 * @param fifo FIFO结构体
 * @return 可填入的最大长度
 */
int H_FIFO_Pack_Byte_GetEmptySize(H_FIFO_Pack_Byte_Def* fifo);

/**
 * @brief 获取可再写入的最大长度
 * @param fifo FIFO结构体
 * @return 可填入的最大长度
 */
int H_FIFO_Pack_UInt16_GetEmptySize(H_FIFO_Pack_UInt16_Def* fifo);

/**
 * @brief 获取可再写入的最大长度
 * @param fifo FIFO结构体
 * @return 可填入的最大长度
 */
int H_FIFO_Pack_UInt32_GetEmptySize(H_FIFO_Pack_UInt32_Def* fifo);

/**
 * @brief 获取可再写入的最大长度
 * @param fifo FIFO结构体
 * @return 可填入的最大长度
 */
int H_FIFO_Pack_UInt64_GetEmptySize(H_FIFO_Pack_UInt64_Def* fifo);






/**
 * @brief 初始化数据流
 * @param fifo FIFO结构体
 * @param Buffer FIFO使用的缓存
 * @param BufferSize 缓存大小(单位:Buffer的类型的一个元素的大小)
 * @param SizeArray 长度表
 * @param SizeArraySize 长度表大小(单位:sizeof(int))
 * @return 无
 */
void H_FIFO_Pack_Byte_Init(H_FIFO_Pack_Byte_Def* fifo,Hbyte_ptr Buffer,int BufferSize,int* SizeArray,int SizeArraySize);

/**
 * @brief 初始化数据流
 * @param fifo FIFO结构体
 * @param Buffer FIFO使用的缓存
 * @param BufferSize 缓存大小(单位:Buffer的类型的一个元素的大小)
 * @param SizeArray 长度表
 * @param SizeArraySize 长度表大小(单位:sizeof(int))
 * @return 无
 */
void H_FIFO_Pack_UInt16_Init(H_FIFO_Pack_UInt16_Def* fifo,Huint16_ptr Buffer,int BufferSize,int* SizeArray,int SizeArraySize);

/**
 * @brief 初始化数据流
 * @param fifo FIFO结构体
 * @param Buffer FIFO使用的缓存
 * @param BufferSize 缓存大小(单位:Buffer的类型的一个元素的大小)
 * @param SizeArray 长度表
 * @param SizeArraySize 长度表大小(单位:sizeof(int))
 * @return 无
 */
void H_FIFO_Pack_UInt32_Init(H_FIFO_Pack_UInt32_Def* fifo,Huint32_ptr Buffer,int BufferSize,int* SizeArray,int SizeArraySize);

/**
 * @brief 初始化数据流
 * @param fifo FIFO结构体
 * @param Buffer FIFO使用的缓存
 * @param BufferSize 缓存大小(单位:Buffer的类型的一个元素的大小)
 * @param SizeArray 长度表
 * @param SizeArraySize 长度表大小(单位:sizeof(int))
 * @return 无
 */
void H_FIFO_Pack_UInt64_Init(H_FIFO_Pack_UInt64_Def* fifo,Huint64_ptr Buffer,int BufferSize,int* SizeArray,int SizeArraySize);







#endif /* APP_INCLUDE_H_FIFO_PACK_H_ */
